﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Clases.Clases;
using AccesoBD;
using Clases.Estructuras;
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb;
namespace Clases.ClasesPersistentes
{
    public class DaoUsuario
    {
        public void insertarUsuario(Usuario pusuario)// insertar
        {
            try
            {

                List<Parametros> parametros = new List<Parametros>();

                Parametros tmp01 = new Parametros("nombre", pusuario.nombre);
                Parametros tmp02 = new Parametros("apellido1", pusuario.apellido1);
                Parametros tmp03 = new Parametros("apellido2", pusuario.apellido2);
                Parametros tmp04 = new Parametros("cedula", pusuario.cedula);
                Parametros tmp05 = new Parametros("telefono", pusuario.telefono);
                Parametros tmp06 = new Parametros("nombreUsuario", pusuario.nombreUsuario);
                Parametros tmp07 = new Parametros("contrasenna", pusuario.contrasenna);
                Parametros tmp08 = new Parametros("idRol", pusuario.rol.idRol);


                string cmdText = "INSERT INTO tusuario (nombre,apellido1,apellido2,cedula,telefono,nombre_usuario,contrasenna, id_rol) " +
                                  "VALUES (@nombre,@apellido1,@apellido2,@cedula,@telefono,@nombreUsuario,@contrasenna, @idRol)";

                parametros.Add(tmp01);
                parametros.Add(tmp02);
                parametros.Add(tmp03);
                parametros.Add(tmp04);
                parametros.Add(tmp05);
                parametros.Add(tmp06);
                parametros.Add(tmp07);
                parametros.Add(tmp08);
                AccesoBD.DBAccess acceso = new DBAccess();

                acceso.ejecutarSQL(cmdText, parametros);
            }
            catch (SqlException e)
            {
                throw e;
            }
        }



        public void modificarUsuario(Usuario pusuario)
        {
            Parametros tmpParametro;
            List<Parametros> parametros;
            parametros = new List<Parametros>();
            try
            {


                AccesoBD.DBAccess accesso = new DBAccess();

                tmpParametro = new Parametros("nombre", pusuario.nombre);
                parametros.Add(tmpParametro);
                tmpParametro = new Parametros("apellido1", pusuario.apellido1);
                parametros.Add(tmpParametro);
                tmpParametro = new Parametros("apellido2", pusuario.apellido2);
                parametros.Add(tmpParametro);
                tmpParametro = new Parametros("cedula", pusuario.cedula);
                parametros.Add(tmpParametro);
                tmpParametro = new Parametros("telefono", pusuario.telefono);
                parametros.Add(tmpParametro);
                tmpParametro = new Parametros("nombreUsuario", pusuario.nombreUsuario);
                parametros.Add(tmpParametro);
                 parametros.Add(tmpParametro);

                String cmdText = "UPDATE tusuario " +
                          "SET nombre = @nombre,apellido1 = @apellido1,apellido2 = @apellido2, cedula = @cedula,telefono = @telefono,nombre_usuario = @nombreUsuario,contrasenna = @contrasenna " +
                          "WHERE cedula = @cedula";

                accesso.ejecutarSQL(cmdText, parametros);
            }
            catch (SqlException e)
            {
                throw e;
            }
        }


        public Usuario buscar(String pnombreUsuario)
        {
            Usuario tmpUsuario = new Usuario();
            try
            {
                String cmdText = "SELECT tusuario.id_Usuario, tusuario.nombre, tusuario.apellido1, tusuario.apellido2, tusuario.cedula, tusuario.telefono, tusuario.nombre_Usuario, trol.nombre AS Expr1 FROM tusuario INNER JOIN trol ON tusuario.id_rol = trol.id_rol WHERE tusuario.nombre_Usuario = @valor01";
                Parametros tmpParametro;
                List<Parametros> parametros;
                parametros = new List<Parametros>();
                tmpParametro = new Parametros("@valor01", pnombreUsuario);
                parametros.Add(tmpParametro);
                AccesoBD.DBAccess acceso = new DBAccess();
                SqlDataReader reader = acceso.ejecutarSelect(cmdText, parametros);

                //recorror el data reader para ir creando las estructuras y agregarlas a la coleccion
                while (reader.Read())
                {
                    tmpUsuario.idUsuario = (int)reader.GetValue(0);

                    tmpUsuario.nombre = reader.GetValue(1).ToString();

                    tmpUsuario.apellido1 = reader.GetValue(2).ToString();

                    tmpUsuario.apellido2 = reader.GetValue(3).ToString();

                    tmpUsuario.cedula = reader.GetValue(4).ToString();

                    tmpUsuario.telefono = reader.GetValue(5).ToString();

                    tmpUsuario.nombreUsuario = reader.GetValue(6).ToString();

                    String nombreRol = reader.GetValue(7).ToString();

                    Rol rol = Gestores.GestorRol.buscarRol(nombreRol);
                    tmpUsuario.rol = rol;
                }
                reader.Close();
                return tmpUsuario;
            }
            catch (SqlException e)
            {
                throw e;
            }
        }

        public List<StrUsuario> buscarCedula(String pcedula)
        {
            StrUsuario tmpUsuario = new StrUsuario();
            List<StrUsuario> listaUsuarios = new List<StrUsuario>();
            try
            {
                String cmdText = "SELECT tusuario.id_Usuario, tusuario.nombre, tusuario.apellido1, tusuario.apellido2, tusuario.cedula, tusuario.telefono, tusuario.nombre_Usuario, trol.nombre AS Expr1 FROM tusuario INNER JOIN trol ON tusuario.id_rol = trol.id_rol WHERE tusuario.cedula LIKE @valor01";
                Parametros tmpParametro;
                List<Parametros> parametros;
                parametros = new List<Parametros>();
                tmpParametro = new Parametros("@valor01", pcedula);
                parametros.Add(tmpParametro);
                AccesoBD.DBAccess acceso = new DBAccess();
                SqlDataReader reader = acceso.ejecutarSelect(cmdText, parametros);

                //recorror el data reader para ir creando las estructuras y agregarlas a la coleccion
                while (reader.Read())
                {

                    tmpUsuario.nombre = reader.GetValue(1).ToString();

                    tmpUsuario.apellido1 = reader.GetValue(2).ToString();

                    tmpUsuario.apellido2 = reader.GetValue(3).ToString();

                    tmpUsuario.cedula = reader.GetValue(4).ToString();

                    tmpUsuario.telefono = reader.GetValue(5).ToString();

                    tmpUsuario.nombreUsuario = reader.GetValue(6).ToString();

                    listaUsuarios.Add(tmpUsuario);
                }
                reader.Close();
                return listaUsuarios;
            }
            catch (SqlException e)
            {
                throw e;
            }
        }

        public Usuario buscarEstudiante(String pnombreUsuario)
        {
            Usuario tmpUsuario = new Usuario();
            try
            {
                String cmdText = "SELECT tusuario.id_Usuario, tusuario.nombre, tusuario.apellido1, tusuario.apellido2, tusuario.cedula, tusuario.telefono, tusuario.nombre_Usuario, trol.nombre AS Expr1 FROM tusuario INNER JOIN trol ON tusuario.id_rol = trol.id_rol WHERE tusuario.nombre_Usuario = @valor01 && trol.nombre = Estudiante" ;
                Parametros tmpParametro;
                List<Parametros> parametros;
                parametros = new List<Parametros>();
                tmpParametro = new Parametros("@valor01", pnombreUsuario);
                parametros.Add(tmpParametro);
                AccesoBD.DBAccess acceso = new DBAccess();
                SqlDataReader reader = acceso.ejecutarSelect(cmdText, parametros);

                //recorror el data reader para ir creando las estructuras y agregarlas a la coleccion
                while (reader.Read())
                {
                    tmpUsuario.idUsuario = (int)reader.GetValue(0);

                    tmpUsuario.nombre = reader.GetValue(1).ToString();

                    tmpUsuario.apellido1 = reader.GetValue(2).ToString();

                    tmpUsuario.apellido2 = reader.GetValue(3).ToString();

                    tmpUsuario.cedula = reader.GetValue(4).ToString();

                    tmpUsuario.telefono = reader.GetValue(5).ToString();

                    tmpUsuario.nombreUsuario = reader.GetValue(6).ToString();

                    String nombreRol = reader.GetValue(7).ToString();

                    Rol rol = Gestores.GestorRol.buscarRol(nombreRol);
                    tmpUsuario.rol = rol;
                }
                reader.Close();
                return tmpUsuario;
            }
            catch (SqlException e)
            {
                throw e;
            }
        }

        public List<StrUsuario> buscarEstudianteCedula(String pcedula)
        {
            StrUsuario tmpUsuario = new StrUsuario();
            List<StrUsuario> listaUsuarios = new List<StrUsuario>();
            try
            {
                String cmdText = "SELECT tusuario.id_Usuario, tusuario.nombre, tusuario.apellido1, tusuario.apellido2, tusuario.cedula, tusuario.telefono, tusuario.nombre_Usuario, trol.nombre AS Expr1 FROM tusuario INNER JOIN trol ON tusuario.id_rol = trol.id_rol WHERE tusuario.cedula LIKE @valor01 AND trol.nombre = 'Estudiante'";
                Parametros tmpParametro;
                List<Parametros> parametros;
                parametros = new List<Parametros>();
                tmpParametro = new Parametros("@valor01", pcedula);
                parametros.Add(tmpParametro);
                AccesoBD.DBAccess acceso = new DBAccess();
                SqlDataReader reader = acceso.ejecutarSelect(cmdText, parametros);

                //recorror el data reader para ir creando las estructuras y agregarlas a la coleccion
                while (reader.Read())
                {

                    tmpUsuario.nombre = reader.GetValue(1).ToString();

                    tmpUsuario.apellido1 = reader.GetValue(2).ToString();

                    tmpUsuario.apellido2 = reader.GetValue(3).ToString();

                    tmpUsuario.cedula = reader.GetValue(4).ToString();

                    tmpUsuario.telefono = reader.GetValue(5).ToString();

                    tmpUsuario.nombreUsuario = reader.GetValue(6).ToString();

                    listaUsuarios.Add(tmpUsuario);
                }
                reader.Close();
                return listaUsuarios;
            }
            catch (SqlException e)
            {
                throw e;
            }
        }


        public void eliminarUsuario(Usuario pusuario)
        {

            List<Parametros> parametros = new List<Parametros>();
            String cmdText = "DELETE FROM tusuario WHERE nombre = @nombre";
            Parametros tmp01 = new Parametros("nombre", pusuario.nombre);
            parametros.Add(tmp01);
            AccesoBD.DBAccess acceso = new DBAccess();
            acceso.ejecutarSQL(cmdText, parametros);
        }

        public List<StrUsuario> listarUsuario()
        {
            StrUsuario tmpUsuario = new StrUsuario();
            List<StrUsuario> listaUsuarios = new List<StrUsuario>();
            try
            {
                String cmdText;
                cmdText = "SELECT nombre,apellido1,apellido2,cedula,telefono,nombre_usuario,contrasenna from tusuario";
                AccesoBD.DBAccess acceso = new DBAccess();
                SqlDataReader reader = acceso.ejecutarSelect(cmdText, null);


                while (reader.Read())
                {

                    listaUsuarios.Add(

                    new StrUsuario(

                    tmpUsuario.nombre = reader.GetValue(0).ToString(),

                    tmpUsuario.apellido1 = reader.GetValue(1).ToString(),

                    tmpUsuario.apellido2 = reader.GetValue(2).ToString(),

                    tmpUsuario.cedula = reader.GetValue(3).ToString(),

                    tmpUsuario.telefono = reader.GetValue(4).ToString(),

                    tmpUsuario.nombreUsuario = reader.GetValue(5).ToString()
                    ));

                }
                reader.Close();
                return listaUsuarios;
            }
            catch (SqlException e)
            {
                throw e;
            }
        }

        public List<StrUsuario> listarDirectoresAcademicos()
        {
            StrUsuario tmpUsuario = new StrUsuario();
            List<StrUsuario> listaUsuarios = new List<StrUsuario>();
            try
            {
                String cmdText;
                cmdText = "SELECT tusuario.nombre, tusuario.apellido1, tusuario.apellido2, tusuario.cedula, tusuario.telefono, tusuario.nombre_Usuario, tusuario.id_rol AS Expr1 FROM tusuario INNER JOIN trol ON tusuario.id_rol = trol.id_rol WHERE trol.nombre = 'Director academico'";
                AccesoBD.DBAccess acceso = new DBAccess();
                SqlDataReader reader = acceso.ejecutarSelect(cmdText, null);

                while (reader.Read())
                {

                    listaUsuarios.Add(

                    new StrUsuario(

                    tmpUsuario.nombre = reader.GetValue(0).ToString(),

                    tmpUsuario.apellido1 = reader.GetValue(1).ToString(),

                    tmpUsuario.apellido2 = reader.GetValue(2).ToString(),

                    tmpUsuario.cedula = reader.GetValue(3).ToString(),

                    tmpUsuario.telefono = reader.GetValue(4).ToString(),

                    tmpUsuario.nombreUsuario = reader.GetValue(5).ToString()
                    ));

                }
                reader.Close();
                return listaUsuarios;
            }
            catch (SqlException e)
            {
                throw e;
            }
        }

        public List<StrUsuario> listarProfesores()
        {
            StrUsuario tmpUsuario = new StrUsuario();
            List<StrUsuario> listaUsuarios = new List<StrUsuario>();
            try
            {
                String cmdText;
                cmdText = "SELECT tusuario.nombre, tusuario.apellido1, tusuario.apellido2, tusuario.cedula, tusuario.telefono, tusuario.nombre_Usuario, tusuario.id_rol AS Expr1 FROM tusuario INNER JOIN trol ON tusuario.id_rol = trol.id_rol WHERE trol.nombre = 'Profesor'";
                AccesoBD.DBAccess acceso = new DBAccess();
                SqlDataReader reader = acceso.ejecutarSelect(cmdText, null);

                while (reader.Read())
                {

                    listaUsuarios.Add(

                    new StrUsuario(

                    tmpUsuario.nombre = reader.GetValue(0).ToString(),

                    tmpUsuario.apellido1 = reader.GetValue(1).ToString(),

                    tmpUsuario.apellido2 = reader.GetValue(2).ToString(),

                    tmpUsuario.cedula = reader.GetValue(3).ToString(),

                    tmpUsuario.telefono = reader.GetValue(4).ToString(),

                    tmpUsuario.nombreUsuario = reader.GetValue(5).ToString()
                    ));

                }
                reader.Close();
                return listaUsuarios;
            }
            catch (SqlException e)
            {
                throw e;
            }
        }

        public List<StrUsuario> listarEstudiantes()
        {
            StrUsuario tmpUsuario = new StrUsuario();
            List<StrUsuario> listaUsuarios = new List<StrUsuario>();
            try
            {
                String cmdText;
                cmdText = "SELECT tusuario.nombre, tusuario.apellido1, tusuario.apellido2, tusuario.cedula, tusuario.telefono, tusuario.nombre_Usuario, trol.nombre AS Expr1 FROM tusuario INNER JOIN trol ON tusuario.id_rol = trol.id_rol WHERE trol.nombre = 'Estudiante'";
                AccesoBD.DBAccess acceso = new DBAccess();
                SqlDataReader reader = acceso.ejecutarSelect(cmdText, null);

                while (reader.Read())
                {

                    listaUsuarios.Add(

                    new StrUsuario(

                    tmpUsuario.nombre = reader.GetValue(0).ToString(),

                    tmpUsuario.apellido1 = reader.GetValue(1).ToString(),

                    tmpUsuario.apellido2 = reader.GetValue(2).ToString(),

                    tmpUsuario.cedula = reader.GetValue(3).ToString(),

                    tmpUsuario.telefono = reader.GetValue(4).ToString(),

                    tmpUsuario.nombreUsuario = reader.GetValue(5).ToString()

                    ));

                }
                reader.Close();
                return listaUsuarios;
            }
            catch (SqlException e)
            {
                throw e;
            }
        }

        public void insertarEstudianteAGrupo(int pestudiante, int pgrupo)
        {
            List<Parametros> parametros = new List<Parametros>();

            Parametros tmp01 = new Parametros("@valor01", pestudiante);
            Parametros tmp02 = new Parametros("@valor02", pgrupo);
            string cmdText = "INSERT INTO testudiante_grupo (id_usuario, id_grupo) VALUES (@valor01, @valor02)";

            parametros.Add(tmp01);
            parametros.Add(tmp02);

            AccesoBD.DBAccess acceso = new DBAccess();

            acceso.ejecutarSQL(cmdText, parametros);
        }

        public Usuario buscarUsuarioSesion(string pnombre, string contrasennaCifrada)
        {
            Usuario tmpUsuario = new Usuario();
            try
            {
                String cmdText = "SELECT nombre,apellido1,apellido2,cedula,telefono,nombre_usuario,contrasenna FROM tusuario WHERE nombre_usuario = valor01 and contrasenna = valor02 ";
                Parametros tmpParametro;
                List<Parametros> parametros;
                parametros = new List<Parametros>();
                tmpParametro = new Parametros("valor01",pnombre);
                parametros.Add(tmpParametro);
                tmpParametro = new Parametros("valor02",contrasennaCifrada);
                parametros.Add(tmpParametro);
                AccesoBD.DBAccess acceso = new DBAccess();
                SqlDataReader reader = acceso.ejecutarSelect(cmdText, parametros);

                //recorror el data reader para ir creando las estructuras y agregarlas a la coleccion
                while (reader.Read())
                {
                    tmpUsuario.nombre = reader.GetValue(0).ToString();

                    tmpUsuario.apellido1 = reader.GetValue(1).ToString();

                    tmpUsuario.apellido2 = reader.GetValue(2).ToString();

                    tmpUsuario.cedula = reader.GetValue(3).ToString();

                    tmpUsuario.telefono = reader.GetValue(4).ToString();

                    tmpUsuario.nombreUsuario = reader.GetValue(5).ToString();
                }
                reader.Close();
                return tmpUsuario;
            }
            catch (SqlException e)
            {
                throw e;
            }
             
        }

        public void importarDatos(String direccion)
        {
            try
            {
                OleDbConnection cnn = new OleDbConnection();
                //cnn.ConnectionString = @"Provider= Microsoft.jet.OLEDB.4.0;Data Source = C:\Users\Usuaario\Desktop\base.xlsx" + @"Extended Properties =""Excel 8.0;HDR=YES;IMEX=1;ImportMixedTypes=Text;TypeGuessRows=0""";
                cnn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + direccion + @"Extended Properties=" + ";Excel 8.0;HDR=YES;" + "";
                OleDbCommand command = new OleDbCommand("SELECT id_usuario, nombre,apellido1,apellido2,cedula,telefono,nombre_usuario,contrasenna" + " From [Datos$]", cnn);

                DataSet dsUsuarios = new DataSet();
                OleDbDataAdapter adapter = new OleDbDataAdapter(command);
                adapter.Fill(dsUsuarios);

                SqlBulkCopy importar = new SqlBulkCopy(Properties.Resources.conexionStr);
                importar.DestinationTableName = "tusuario";
                importar.WriteToServer(dsUsuarios.Tables[0]);

                importar.Close();
            }
            catch (SqlException e)
            {
                throw e;
            }
        }
    }
}

